package rtti;

import utils.Log;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.regex.Pattern;

/**
 * Created by shane on 2018/7/9.
 */
public class ShowMethods {

    private static String usage =
            "usage: \n" +
                    "ShowMethods qualified.class.name\n" +
                    "To show all methods in class or :\n" +
                    "ShowMethods qualified.class.name word\n" +
                    "To search for methods involving 'word";

    private static Pattern p = Pattern.compile("\\w+\\.");

    public static void main(String[] args) {
        if (args.length < 1) {
            Log.vn(usage);
            System.exit(0);
        }

        int lines = 0;

        try {
            Class<?> c = Class.forName(args[0]);
            Method[] methods = c.getMethods();
            Constructor[] ctors = c.getConstructors();

            if (args.length == 1) {
                for (Method method : methods) {
                    Log.vn(p.matcher(method.toString()).replaceAll(" "));
                }

                for (Constructor ctor : ctors) {
                    Log.vn(p.matcher(ctor.toString()).replaceAll(" "));
                }

                lines = methods.length + ctors.length;
            } else {

                for (Method method : methods) {
                    if (method.toString().indexOf(args[1]) != -1) {
                        Log.vn(p.matcher(method.toString()).replaceAll(" "));
                        lines++;
                    }
                }

                for (Constructor ctor : ctors) {
                    if (ctor.toString().indexOf(args[1]) != -1) {
                        Log.vn(p.matcher(ctor.toString()).replaceAll(" "));
                        lines++;
                    }
                }
            }


        } catch (ClassNotFoundException e) {
            Log.vn("No such class: " + e);
        }


        Log.vn("lines:" + lines);
    }
}
